const express = require("express");
const fs = require("fs");
const app = express();
const path = require("path");
const template = require("art-template");

app.engine("art", require("express-art-template")); // 使用 .art 后缀的文件的时候使用 express-art-template 模板引擎
app.set("view options", {
  // art-template 配置项
  debug: process.env.NODE_ENV !== "production",
});
app.set("views", path.join(__dirname, "views")); // 设置模板文件目录
app.set("view engine", "art"); // 可以省略的模块文件后缀名

const todos = [
  { id: 1, title: "吃饭1", completed: false },
  { id: 2, title: "吃饭2", completed: false },
  { id: 3, title: "吃饭3", completed: false },
  { id: 4, title: "吃饭4", completed: false },
];

// 直接访问时, 不需要加public前缀
// app.use(express.static(path.join(__dirname, "./public"))); // 设置静态文件目录
// 注意: 这里的相对路径时相对与node执行的目录, 因此需要使用绝对路径

// 多个静态资源目录托管时, 有冲突的情况下, 靠前的目录会覆盖靠后的目录, 因此最好时每一个静态资源托管中最好是加上前缀
app.use(
  // 设置静态文件目录
  "/public",
  express.static(path.join(__dirname, "./public"), {
    index: ["index.html"], // 不允许目录浏览
  })
);

app.use(
  "/node_modules",
  express.static(path.join(__dirname, "./node_modules"))
);

app.get("/", (req, res) => {
  // 1. 普通文本
  // res.send("Hello World!");
  // 2. HTML 格式文本
  // res.send("<h1>Hello World!</h1>");
  // 3. 读取本地 HTML 文件并发送
  /* fs.readFile("./views/index.html", "utf8", (err, data) => {
    if (err) return res.status(500).send("Error loading index.html");
    res.send(data.toString());
  }); */
  // 4. 读取本地 HTML 文件并替换模板变量
  /* fs.readFile("./views/index.html", "utf8", (err, data) => {
    if (err) return res.status(500).send("Error loading index.html");
    let str = "";
    todos.forEach((todo) => {
      str += `<li>${todo.title}</li>`;
    });
    const ret = data.replace("^_^", str);
    res.send(ret);
  }); */
  // 5. 使用art-template模板引擎
  /* fs.readFile("./views/index.html", "utf8", (err, templateStr) => {
    if (err) return res.status(500).send("Error loading index.html");

    const ret = template.render(templateStr, {
      foo: "bar",
      todos,
    });

    res.send(ret);
  }); */

  // 6. 使用art-template模板引擎，并渲染模板文件
  res.render("index.art", {
    foo: "bar",
    todos,
  });
});

app.listen(3000, () => {
  console.log("Example app listening on port 3000!");
});
